﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

#Область ОбработчикиСобытийФорм

// Обработчик события "ПриСозданииНаСервере" формы документа.
//
//	Параметры:
//  Форма - ФормаКлиентскогоПриложения:
//   * Объект - ДанныеФормыСтруктура, ДокументОбъект - основной реквизит формы.
//  Расположение - ГруппаФормы - группа, в которой будет располагаться надпись о текущем состоянии оригинала.
//		Если Неопределено, тогда надпись будет расположена в нижнем правом углу формы. Необязательный. 
//
Процедура ПриСозданииНаСервере_ФормаДокумента(Форма, Расположение = Неопределено) Экспорт

	Если ПолучитьФункциональнуюОпцию("ИспользоватьУчетОригиналовПервичныхДокументов") = Ложь
	Или Не ПравоДоступа("Чтение",Метаданные.РегистрыСведений.СостоянияОригиналовПервичныхДокументов) Тогда
		ОтключаемаяДекорация = Форма.Элементы.Найти("ДекорацияСостояниеОригинала");
		Если Не ОтключаемаяДекорация = Неопределено Тогда
			ОтключаемаяДекорация.Видимость = Ложь;
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	Реквизиты = Новый Массив;
	Реквизиты.Добавить(Новый РеквизитФормы("СписокВыбораСостоянийОригинала", Новый ОписаниеТипов("СписокЗначений")));
	
	Форма.ИзменитьРеквизиты(Реквизиты);

	СостоянияОригиналов = ИспользуемыеСостояния();
	
	ЗаполнитьСписокВыбораСостоянийОригинала(Форма, СостоянияОригиналов);
	
	Если Расположение = Неопределено Тогда
		Родитель = Форма;
	Иначе
		Родитель = Расположение;
	КонецЕсли;
	
	ДекорацияСостояниеОригинала = Форма.Элементы.Добавить("ДекорацияСостояниеОригинала", Тип("ДекорацияФормы"), Родитель);
	ДекорацияСостояниеОригинала.Вид = ВидДекорацииФормы.Надпись;
	ДекорацияСостояниеОригинала.Гиперссылка = Истина;
	Если Расположение = Неопределено Тогда
		ДекорацияСостояниеОригинала.ГоризонтальноеПоложениеВГруппе = ГоризонтальноеПоложениеЭлемента.Право;
	КонецЕсли;
	ДекорацияСостояниеОригинала.УстановитьДействие("Нажатие", "Подключаемый_ДекорацияСостояниеОригиналаНажатие");

	Если ЗначениеЗаполнено(Форма.Объект.Ссылка) Тогда
		ТекущиеСостояниеОригинала = СведенияОСостоянииОригиналаПоСсылке(Форма.Объект.Ссылка);
		Если ТекущиеСостояниеОригинала.Количество() = 0 Тогда
			ТекущиеСостояниеОригинала=НСтр("ru='<Состояние оригинала неизвестно>'");
			ДекорацияСостояниеОригинала.ЦветТекста = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет;
		Иначе
			ТекущиеСостояниеОригинала = ТекущиеСостояниеОригинала.СостояниеОригиналаПервичногоДокумента;
		КонецЕсли;
	Иначе
		ТекущиеСостояниеОригинала=НСтр("ru='<Состояние оригинала неизвестно>'");
		ДекорацияСостояниеОригинала.ЦветТекста = ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет;
	КонецЕсли;

	ДекорацияСостояниеОригинала.Заголовок = ТекущиеСостояниеОригинала;

КонецПроцедуры

// Обработчик события "ПриСозданииНаСервере" формы списка.
//
//	Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма списка документа.
//  Список - ТаблицаФормы - основной список формы.
//  Расположение - ПолеФормы - колонка списка, перед которой будут располагаться новые колонки состояний.
//		Если Неопределено, тогда колонки будут расположены в конце списка. Необязательный.
//
Процедура ПриСозданииНаСервере_ФормаСписка(Форма, Список, Расположение = Неопределено) Экспорт

	Если ПолучитьФункциональнуюОпцию("ИспользоватьУчетОригиналовПервичныхДокументов") = Ложь 
	Или Не ПравоДоступа("Чтение",Метаданные.РегистрыСведений.СостоянияОригиналовПервичныхДокументов) Тогда
		ОтключаемаяКолонка = Форма.Элементы.Найти("СостояниеОригиналПолучен");
		Если Не ОтключаемаяКолонка = Неопределено Тогда
			ОтключаемаяКолонка.Видимость = Ложь;
		КонецЕсли;
		Возврат;
	КонецЕсли;
	
	// Создание колонок в динамическом списке
	РеквизитСписокСостояние = Форма.Элементы.Вставить("СостояниеОригиналПолучен",Тип("ПолеФормы"),Список,Расположение);
	РеквизитСписокСостояние.Вид = ВидПоляФормы.ПолеКартинки;
	РеквизитСписокСостояние.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; 
	РеквизитСписокСостояние.КартинкаЗначений = БиблиотекаКартинок.КоллекцияПиктограммНаличиеОригиналаПервичногоДокумента;
	РеквизитСписокСостояние.КартинкаШапки = БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналПолучен;
	РеквизитСписокСостояние.ПутьКДанным = Список.Имя + ".СостояниеОригиналПолучен";
	
	РеквизитСписокСостояние = Форма.Элементы.Вставить("СостояниеОригиналаПервичногоДокумента",Тип("ПолеФормы"),Список,Расположение);
	РеквизитСписокСостояние.Вид = ВидПоляФормы.ПолеНадписи;
	РеквизитСписокСостояние.ГиперссылкаЯчейки = Истина; 
	РеквизитСписокСостояние.Заголовок = НСтр("ru='Состояние оригинала'");
	РеквизитСписокСостояние.ПутьКДанным = Список.Имя + ".СостояниеОригиналаПервичногоДокумента";
	
	Если Не ПраваНаИзменениеСостояния() Тогда
		Возврат;
	КонецЕсли;
	
	// Создание списка
	Реквизиты = Новый Массив;
	Реквизиты.Добавить(Новый РеквизитФормы("СписокВыбораСостоянийОригинала", Новый ОписаниеТипов("СписокЗначений")));	
	Форма.ИзменитьРеквизиты(Реквизиты);
	
	СостоянияОригиналов = ИспользуемыеСостояния();
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		ВывестиНаФормуКомандыСостоянияОригинала(Форма, Список, СостоянияОригиналов);
	КонецЕсли;

	ЗаполнитьСписокВыбораСостоянийОригинала(Форма, СостоянияОригиналов);

КонецПроцедуры

// Обработчик события "ПриПолученииДанныхНаСервере" формы списка.
//
//	Параметры:
//  СтрокиСписка - СтрокиДинамическогоСписка - строки списка документов.
//
Процедура ПриПолученииДанныхНаСервере(СтрокиСписка) Экспорт
	
	Если ПолучитьФункциональнуюОпцию("ИспользоватьУчетОригиналовПервичныхДокументов") = Ложь 
	Или Не ПравоДоступа("Чтение",Метаданные.РегистрыСведений.СостоянияОригиналовПервичныхДокументов) Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого Строка Из СтрокиСписка Цикл
		Строка = СтрокиСписка[Строка.Ключ];
		Если Строка.Оформление.Получить("СостояниеОригиналаПервичногоДокумента") = Неопределено 
		Или Строка.Оформление.Получить("СостояниеОригиналПолучен") = Неопределено Тогда
			Возврат
		КонецЕсли;
		Прервать;
	КонецЦикла;

	Ключи = СтрокиСписка.ПолучитьКлючи(); // Массив из ДокументСсылка, Массив из РегистрСведенийКлючЗаписи
	Ссылки = Новый Массив;
	ИмяКлючевогоПоля = "Ссылка";
	Для Каждого Ключ Из Ключи Цикл 
		ЭтоСсылка = ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Ключ));
		Если ЭтоСсылка Тогда
			Ссылки.Добавить(Ключ);
		Иначе
			Ссылки.Добавить(Ключ[ИмяКлючевогоПоля]);
		КонецЕсли;
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	СостоянияОригиналовПервичныхДокументов.Состояние КАК СостояниеОригиналаПервичногоДокумента,
	               |	СостоянияОригиналовПервичныхДокументов.ОбщееСостояние КАК ОбщееСостояние,
	               |	ВЫБОР
	               |		КОГДА СостоянияОригиналовПервичныхДокументов.Состояние = ЗНАЧЕНИЕ(Справочник.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен)
	               |			ТОГДА 1
	               |		ИНАЧЕ 0
	               |	КОНЕЦ КАК СостояниеОригиналПолучен,
	               |	СостоянияОригиналовПервичныхДокументов.Владелец КАК Ссылка
	               |ИЗ
	               |	РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов
	               |ГДЕ
	               |	СостоянияОригиналовПервичныхДокументов.ОбщееСостояние
	               |	И СостоянияОригиналовПервичныхДокументов.Владелец В(&Ссылка)";
	Запрос.УстановитьПараметр("Ссылка",Ссылки);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Для Каждого Строка Из СтрокиСписка Цикл
		Строка = СтрокиСписка[Строка.Ключ];
		Выборка.Сбросить();
		Если Выборка.НайтиСледующий(Строка.Данные["Ссылка"], "Ссылка") Тогда 
			Строка.Данные["СостояниеОригиналаПервичногоДокумента"] = Выборка.СостояниеОригиналаПервичногоДокумента;
			Строка.Оформление["СостояниеОригиналаПервичногоДокумента"].УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ГиперссылкаЦвет); 
			Строка.Данные["СостояниеОригиналПолучен"] = Выборка.СостояниеОригиналПолучен;
		Иначе
			Строка.Данные["СостояниеОригиналаПервичногоДокумента"] = НСтр("ru = '<Неизвестно>'");
			Строка.Оформление["СостояниеОригиналаПервичногоДокумента"].УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет); 
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

// Обновляет команды установки состояния оригинала на форме списка.
//
//	Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма списка документа.
//  Список - ТаблицаФормы - основной список формы.
//
Процедура ОбновитьКомандыСостоянияОригинала(Форма, Список) Экспорт

	СостоянияОригиналов = ИспользуемыеСостояния();

	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		ПодменюУстановитьНастроитьСостояниеОригинала = Форма.Элементы.Найти("ПодменюУстановитьНастроитьСостояниеОригиналаОбычное");		
		Если Не ПодменюУстановитьНастроитьСостояниеОригинала = Неопределено Тогда
			Форма.Элементы.Удалить(ПодменюУстановитьНастроитьСостояниеОригинала);
		КонецЕсли;
		
		ПодменюУстановитьНастроитьСостояниеОригинала = Форма.Элементы.Найти("ПодменюУстановитьНастроитьСостояниеОригиналаСмТакже");		
		Если Не ПодменюУстановитьНастроитьСостояниеОригинала = Неопределено Тогда
			Форма.Элементы.Удалить(ПодменюУстановитьНастроитьСостояниеОригинала);
		КонецЕсли;
	КонецЕсли;
	
	ВывестиНаФормуКомандыСостоянияОригинала(Форма, Список, СостоянияОригиналов);

	ЗаполнитьСписокВыбораСостоянийОригинала(Форма, СостоянияОригиналов);

КонецПроцедуры

// Устанавливает условное форматирование для подключаемых элементов в списке.
//
//	Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма списка документа.
//  Список - ТаблицаФормы - основной список формы.
//
Процедура УстановитьУсловноеОформлениеВФормеСписка(Форма, Список) Экспорт

	ЭлементОформления = Форма.УсловноеОформление.Элементы.Добавить();

	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Список.Имя+".СостояниеОригиналаПервичногоДокумента"); 
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено;
	ЭлементОтбора.Использование = Истина;

	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<Неизвестно>'"));
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста",  ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	ЭлементОформления.Использование = Истина;
	
	ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
	ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("СостояниеОригиналаПервичногоДокумента");
	ПолеОформления.Использование = Истина;
	
	ЭлементОформления = Форма.УсловноеОформление.Элементы.Добавить();

	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Список.Имя+".СостояниеОригиналаПервичногоДокумента"); 
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено;
	ЭлементОтбора.Использование = Истина;
	
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ГиперссылкаЦвет);
	ЭлементОформления.Использование = Истина;

	ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
	ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("СостояниеОригиналаПервичногоДокумента");
	ПолеОформления.Использование = Истина;

КонецПроцедуры

// Добавляет в описание профиля поставляемых групп доступа роль для изменения состояния оригинала. 
//
// Параметры:
//  ОписаниеПрофиля - см. УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа
//
Процедура ДополнитьПрофильРольюДляИзмененияСостоянийОригиналовДокументов(ОписаниеПрофиля) Экспорт

	ОписаниеПрофиля.Роли.Добавить("ИзменениеСостоянийОригиналовПервичныхДокументов");

КонецПроцедуры

// Добавляет в описание профиля поставляемых групп доступа роль для настройки списка состояния оригинала.
//
// Параметры:
//  ОписаниеПрофиля - см. УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа.
//  
Процедура ДополнитьПрофильРольюДляНастройкиСостоянийОригиналовДокументов(ОписаниеПрофиля) Экспорт

	ОписаниеПрофиля.Роли.Добавить("ДобавлениеИзменениеСостоянийОригиналовПервичныхДокументов");

КонецПроцедуры

// Добавляет в описание профиля поставляемых групп доступа роль для чтения состояния оригинала.
//
// Параметры:
//  ОписаниеПрофиля - см. УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа.
//
Процедура ДополнитьПрофильРольюДляЧтенияСостоянийОригиналовДокументов(ОписаниеПрофиля) Экспорт

	ОписаниеПрофиля.Роли.Добавить("ЧтениеСостоянийОригиналовПервичныхДокументов");

КонецПроцедуры

// Возвращает массив всех состояний.
//
//	Возвращаемое значение:
//  Массив из СправочникСсылка.СостоянияОригиналовПервичныхДокументов - все возможные состояния оригинала, включая
//    скрытое "Оригиналы не все".
//
Функция ВсеСостояния() Экспорт
	
	Запрос = Новый запрос;
	Запрос.Текст ="ВЫБРАТЬ РАЗРЕШЕННЫЕ
	              |	СостоянияОригиналовПервичныхДокументов.Ссылка КАК Состояние
	              |ИЗ
	              |	Справочник.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов
	              |ГДЕ
	              |	НЕ СостоянияОригиналовПервичныхДокументов.ПометкаУдаления
	              |
	              |УПОРЯДОЧИТЬ ПО
	              |	СостоянияОригиналовПервичныхДокументов.РеквизитДопУпорядочивания" ;

	Выборка = Запрос.Выполнить();

	Возврат Выборка.Выгрузить().ВыгрузитьКолонку("Состояние");

КонецФункции

// Выводит подключаемые команды в форме. Вызывается без подключения подсистемы "Подключаемые команды".
//
//	Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма списка документа.
//  Список - ТаблицаФормы - основной список формы.
//  СостоянияОригиналов - ТаблицаЗначений - состояния оригинала, разрешенные пользователям, и используемые при смене
//                                          состояния оригинала:
//              * Наименование 	- Строка - наименование состояния оригинала;
//              * Ссылка		- СправочникСсылка.СостоянияОригиналовПервичныхДокументов - ссылка на элемент справочника СостоянияОригиналовПервичныхДокументов.
//
Процедура ВывестиНаФормуКомандыСостоянияОригинала(Форма, Список, СостоянияОригиналов) Экспорт

	// Проверка и создание подменю и групп кнопок на командной панели списка
	Элементы = Форма.Элементы;

	Если Элементы.Найти("ПодменюУстановитьНастроитьСостояниеОригинала") = Неопределено Тогда
		ПодменюУстановитьНастроитьСостояниеОригинала = Элементы.Добавить("ПодменюУстановитьНастроитьСостояниеОригинала",Тип("ГруппаФормы"),Список.КоманднаяПанель);
		ПодменюУстановитьНастроитьСостояниеОригинала.Вид = ВидГруппыФормы.Подменю;
		ПодменюУстановитьНастроитьСостояниеОригинала.Отображение = ОтображениеКнопки.Картинка; 
		ПодменюУстановитьНастроитьСостояниеОригинала.Картинка = БиблиотекаКартинок.УстановитьСостояниеОригиналаПервичногоДокумента;
		ПодменюУстановитьНастроитьСостояниеОригинала.Заголовок = НСтр("ru='Установить состояние оригинала'");
		ПодменюУстановитьНастроитьСостояниеОригинала.Подсказка = НСтр("ru='Подменю команд для установки и изменения состояния оригиналов первичных документов.'");
	КонецЕсли;
	ПодменюУстановитьНастроитьСостояниеОригинала = Элементы.Найти("ПодменюУстановитьНастроитьСостояниеОригинала");
	
	Если Элементы.Найти("ГруппаУстановитьСостояниеОригинала") = Неопределено Тогда
		ГруппаУстановитьСостояниеОригинала = Элементы.Добавить("ГруппаУстановитьСостояниеОригинала", Тип("ГруппаФормы"),
			ПодменюУстановитьНастроитьСостояниеОригинала);
		ГруппаУстановитьСостояниеОригинала.Вид = ВидГруппыФормы.ГруппаКнопок;
	КонецЕсли;
	ГруппаУстановитьСостояниеОригинала = Элементы.Найти("ГруппаУстановитьСостояниеОригинала");

	Если Элементы.Найти("ГруппаНастроитьСостоянияОригинала") = Неопределено Тогда
		ГруппаНастроитьСостоянияОригинала = Элементы.Добавить("ГруппаНастроитьСостоянияОригинала", Тип("ГруппаФормы"),
			ПодменюУстановитьНастроитьСостояниеОригинала);
		ГруппаНастроитьСостоянияОригинала.Вид = ВидГруппыФормы.ГруппаКнопок;
	КонецЕсли;
	ГруппаНастроитьСостоянияОригинала = Элементы.Найти("ГруппаНастроитьСостоянияОригинала");

	Если Элементы.Найти("ГруппаУстановитьОригиналПолучен") = Неопределено Тогда
		ГруппаУстановитьОригиналПолучен =  Элементы.Добавить("ГруппаУстановитьОригиналПолучен", Тип("ГруппаФормы"), 
			Список.КоманднаяПанель); 
		ГруппаУстановитьОригиналПолучен.Вид = ВидГруппыФормы.ГруппаКнопок;
		ГруппаУстановитьОригиналПолучен.Подсказка = НСтр("ru='Установить конечное состояние оригинала первичного документа ""Оригинал получен"".'");
	КонецЕсли;
	ГруппаУстановитьОригиналПолучен = Элементы.Найти("ГруппаУстановитьОригиналПолучен");
	
	Для Каждого Состояние Из ГруппаУстановитьСостояниеОригинала.ПодчиненныеЭлементы Цикл
		НайденнаяКоманда = Форма.Команды.Найти(Состояние.ИмяКоманды);
		НайденнаяКнопка = Форма.Элементы.Найти(Состояние.ИмяКоманды);

		Если Не НайденнаяКоманда = Неопределено Тогда
			Форма.Команды.Удалить(НайденнаяКоманда);
			Форма.Элементы.Удалить(НайденнаяКнопка);
		КонецЕсли;			
	КонецЦикла;
	
	// Удаляем последнюю кнопку
	Если ГруппаУстановитьСостояниеОригинала.ПодчиненныеЭлементы.Количество() > 0 Тогда 
		Состояние = ГруппаУстановитьСостояниеОригинала.ПодчиненныеЭлементы[0];
		НайденнаяКоманда = Форма.Команды.Найти(Состояние.ИмяКоманды);
		НайденнаяКнопка = Форма.Элементы.Найти(Состояние.ИмяКоманды);
	КонецЕсли;
	
	Если Не НайденнаяКоманда = Неопределено Тогда
		Форма.Команды.Удалить(НайденнаяКоманда);
		Форма.Элементы.Удалить(НайденнаяКнопка);
	КонецЕсли;
	
	Для Каждого Состояние Из СостоянияОригиналов Цикл
		ИмяКоманды = "Команда" + СтрЗаменить(Состояние.Ссылка.УникальныйИдентификатор(),"-","_");
		ИмяКнопки = Состояние.Наименование;

		Если Форма.Команды.Найти(ИмяКоманды) = Неопределено Тогда
			Команда = Форма.Команды.Добавить(ИмяКоманды);
			Команда.Действие = "Подключаемый_УстановитьСостояниеОригинала";

			// Кнопки командной панели
			КнопкаУстановитьСостояние = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ГруппаУстановитьСостояниеОригинала);
			КнопкаУстановитьСостояние.Заголовок = ИмяКнопки;
			КнопкаУстановитьСостояние.ИмяКоманды = ИмяКоманды;

			// Устанавливаем картинки
			Если Состояние.Ссылка = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен Тогда
				КнопкаУстановитьСостояние.Картинка = БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналПолучен;
			ИначеЕсли Состояние.Ссылка = Справочники.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана Тогда
				КнопкаУстановитьСостояние.Картинка = БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналНеПолучен;
			КонецЕсли;
			
		КонецЕсли;

	КонецЦикла;

	// Добавляет кнопку для перехода к настройкам состояний в подменю командой панели списка "Установить состояние".
	Если ПравоДоступа("Добавление",Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов) 
		И ПравоДоступа("Изменение",Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов) Тогда
		ИмяКоманды = "НастройкаСостояний";
		ИмяКнопки = НСтр("ru='Настроить...'");

		Если Форма.Команды.Найти(ИмяКоманды) = Неопределено Тогда
			КомандаФормы  = Форма.Команды.Добавить(ИмяКоманды);
			КомандаФормы.Действие = "Подключаемый_УстановитьСостояниеОригинала";
			КомандаФормы.Заголовок = ИмяКнопки;
			
			КнопкаНастроитьСостояния = Форма.Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"),ГруппаНастроитьСостоянияОригинала);
			КнопкаНастроитьСостояния.Заголовок = ИмяКнопки;
			КнопкаНастроитьСостояния.ИмяКоманды = ИмяКоманды;
			КнопкаНастроитьСостояния.Картинка = БиблиотекаКартинок.НастроитьСостоянияОригиналаПервичногоДокумента;
		КонецЕсли; 
		
	КонецЕсли;

	// Добавляет кнопку "Установить оригинал получен" на командой панели списка 
	ИмяКоманды = "УстановитьОригиналПолучен";
	Если Форма.Команды.Найти(ИмяКоманды) = Неопределено Тогда
		КомандаФормы  = Форма.Команды.Добавить(ИмяКоманды);
		КомандаФормы.Действие = "Подключаемый_УстановитьСостояниеОригинала";
		КомандаФормы.Заголовок = НСтр("ru='Установить ""Оригинал получен""'");
		КомандаФормы.Подсказка = НСтр("ru='Установить ""Оригинал получен""'");
		
		НоваяКнопка = Форма.Элементы.Добавить("Кнопка" + ИмяКоманды , Тип("КнопкаФормы"), ГруппаУстановитьОригиналПолучен);
		НоваяКнопка.Картинка = БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналПолучен;
		НоваяКнопка.ИмяКоманды = ИмяКоманды;
	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// См. ОбновлениеИнформационнойБазыБСП.ПриДобавленииОбработчиковОбновления.
Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт
	
	Обработчик = Обработчики.Добавить();
	Обработчик.Версия = "3.1.3.142";
	Обработчик.НачальноеЗаполнение = Истина;
	Обработчик.Процедура = "УчетОригиналовПервичныхДокументов.ЗаполнитьСостоянияОригиналаПервичногоДокумента";
	Обработчик.РежимВыполнения = "Оперативно";
	
	Обработчик = Обработчики.Добавить();
	Обработчик.Версия = "3.1.4.137"; 
	Обработчик.Идентификатор = Новый УникальныйИдентификатор("35320bc5-3ec6-4036-9253-ee5c507531e3");
	Обработчик.Процедура = "Справочники.СостоянияОригиналовПервичныхДокументов.ОбработатьДанныеДляПереходаНаНовуюВерсию";
	Обработчик.Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Перезаполнение служебного реквизита %1 для устранения вероятного сбоя порядка.'")
		,"РеквизитДопУпорядочивания");
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.ПроцедураЗаполненияДанныхОбновления = "Справочники.СостоянияОригиналовПервичныхДокументов.ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию";
	Обработчик.ПроцедураПроверки    = "ОбновлениеИнформационнойБазы.ДанныеОбновленыНаНовуюВерсиюПрограммы";
	Обработчик.ЧитаемыеОбъекты      = "Справочник.СостоянияОригиналовПервичныхДокументов";
	Обработчик.ИзменяемыеОбъекты    = "Справочник.СостоянияОригиналовПервичныхДокументов";
	Обработчик.БлокируемыеОбъекты   = "Справочник.СостоянияОригиналовПервичныхДокументов";
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность") Тогда
		Обработчик.ПриоритетыВыполнения = ОбновлениеИнформационнойБазы.ПриоритетыВыполненияОбработчика();
		Приоритет = Обработчик.ПриоритетыВыполнения.Добавить();
		Приоритет.Процедура = "МультиязычностьСервер.ОбработатьДанныеДляПереходаНаНовуюВерсию";
		Приоритет.Порядок = "До";
	КонецЕсли;
	
КонецПроцедуры

// Смотри также ОбновлениеИнформационнойБазыПереопределяемый.ПриОпределенииНастроек
//
// Параметры:
//  Объекты - Массив из ОбъектМетаданных
//
Процедура ПриОпределенииОбъектовСНачальнымЗаполнением(Объекты) Экспорт

	Объекты.Добавить(Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов);

КонецПроцедуры

// См. ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных.
Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт

	СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов.ПолноеИмя(), "ПолноеИмя");
	Если СтрокаТаблицы <> Неопределено Тогда 
		ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
	КонецЕсли;

КонецПроцедуры

// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииВидовПодключаемыхКоманд.
Процедура ПриОпределенииВидовПодключаемыхКоманд(ВидыПодключаемыхКоманд) Экспорт
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьУчетОригиналовПервичныхДокументов")Тогда
		Возврат;
	КонецЕсли;

	Вид = ВидыПодключаемыхКоманд.Добавить();
	Вид.Имя         = "УстановкаСостоянияОригинала";
	Вид.ИмяПодменю  = "ПодменюУстановитьНастроитьСостояниеОригинала";
	Вид.Заголовок   = НСтр("ru = 'Установить состояние оригинала'");
	Вид.Картинка    = БиблиотекаКартинок.УстановитьСостояниеОригиналаПервичногоДокумента;
	Вид.Отображение = ОтображениеКнопки.Картинка;
	
	Вид = ВидыПодключаемыхКоманд.Добавить();
	Вид.Имя         = "УстановкаСостоянияОригиналПолучен";
	Вид.ИмяПодменю  = "УстановитьСостояниеОригиналПолучен";
	Вид.Заголовок   = НСтр("ru='Установить состояние ""Оригинал получен""'");
	Вид.Картинка    = БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналПолучен;	
	Вид.Отображение = ОтображениеКнопки.Картинка;

КонецПроцедуры

// См. ПодключаемыеКомандыПереопределяемый.ПриОпределенииКомандПодключенныхКОбъекту.
Процедура ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды) Экспорт
	
	Если Не ПраваНаИзменениеСостояния() Тогда
		Возврат;
	КонецЕсли;

	ОбъектыСУчетомОригиналовПервичныхДокументов = Новый Массив;
		
	УчетОригиналовПервичныхДокументовПереопределяемый.ПриОпределенииОбъектовСКомандамиУчетаОригиналов(ОбъектыСУчетомОригиналовПервичныхДокументов);
	
	ВыводитьКоманды = Ложь;
	
	Для Каждого Объект Из ОбъектыСУчетомОригиналовПервичныхДокументов Цикл		
		Если СтрНайти(НастройкиФормы.ИмяФормы, Объект) Тогда
			ВыводитьКоманды = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Если Не ВыводитьКоманды Тогда
		Возврат;
	КонецЕсли;
	
	ОбъектыСУчетомОригиналовПервичныхДокументов.Очистить();
	
	Для Каждого Тип Из Метаданные.ОпределяемыеТипы.ОбъектСУчетомОригиналовПервичныхДокументов.Тип.Типы() Цикл
		Если Тип = Тип("Строка") Тогда
			Возврат;
		КонецЕсли;
		ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
		ОбъектыСУчетомОригиналовПервичныхДокументов.Добавить(ОбъектМетаданных.ПолноеИмя());
	КонецЦикла;
	
	Для Каждого Источник Из Источники.Строки Цикл
		Если ОбъектыСУчетомОригиналовПервичныхДокументов.Найти(Источник.ПолноеИмя) <> Неопределено Тогда
			ВыводитьКоманды = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Если Не ВыводитьКоманды Тогда
		Возврат;
	КонецЕсли;

	СостоянияОригиналов = ИспользуемыеСостояния();
	
	Порядок = 0;
	
	// Команды по состояниям оригинала
	Для Каждого Состояние Из СостоянияОригиналов Цикл		
		Команда = Команды.Добавить();
		Команда.Вид = "УстановкаСостоянияОригинала";
		Команда.Представление = Состояние.Наименование;
		Команда.Порядок = Порядок + 1; 
		// Устанавливаем картинки
		Если Состояние.Ссылка = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен Тогда
			Команда.Картинка = БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналПолучен;
		ИначеЕсли Состояние.Ссылка = Справочники.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана Тогда
			Команда.Картинка = БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналНеПолучен;
		КонецЕсли;		
		Команда.ТипПараметра = Метаданные.ОпределяемыеТипы.ОбъектСУчетомОригиналовПервичныхДокументов.Тип;
		Команда.Назначение = "ДляСписка";
		Команда.РежимЗаписи = "Проводить";
		Команда.ФункциональныеОпции = "ИспользоватьУчетОригиналовПервичныхДокументов";
		Команда.Обработчик = "УчетОригиналовПервичныхДокументовКлиент.Подключаемый_УстановитьСостояниеОригинала";
		
		Порядок = Порядок + 1;
	КонецЦикла;
	
	// Команда для перехода к настройкам состояний в подменю командой панели списка "Установить состояние", если у польз.
	// есть соответствующая роль
	Если ПравоДоступа("Добавление",Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов) 
		И ПравоДоступа("Изменение",Метаданные.Справочники.СостоянияОригиналовПервичныхДокументов) Тогда
		Команда = Команды.Добавить();
		Команда.Вид = "УстановкаСостоянияОригинала";
		Команда.Идентификатор = "НастройкаСостояний";
		Команда.Представление = НСтр("ru='Настроить...'");
		Команда.Важность = "СмТакже";
		Команда.Картинка = БиблиотекаКартинок.НастроитьСостоянияОригиналаПервичногоДокумента;
		Команда.ТипПараметра = Метаданные.ОпределяемыеТипы.ОбъектСУчетомОригиналовПервичныхДокументов.Тип;
		Команда.Назначение = "ДляСписка";
		Команда.РежимЗаписи = "НеЗаписывать";
		Команда.ФункциональныеОпции = "ИспользоватьУчетОригиналовПервичныхДокументов";
		Команда.Обработчик = "УчетОригиналовПервичныхДокументовКлиент.Подключаемый_УстановитьСостояниеОригинала";	
	КонецЕсли;
	
	Наименование = Строка(Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен);

	// Команда "Установить оригинал получен" на командой панели списка 
		Команда = Команды.Добавить();
		Команда.Вид = "УстановкаСостоянияОригиналПолучен";
		Команда.Представление = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(НСтр("ru='Установить состояние ""[Наименование]""'"),Новый Структура("Наименование",Наименование));
		Команда.ОтображениеКнопки = ОтображениеКнопки.Картинка;
		Команда.Картинка = БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналПолучен;
		Команда.ТипПараметра = Метаданные.ОпределяемыеТипы.ОбъектСУчетомОригиналовПервичныхДокументов.Тип;
		Команда.Назначение = "ДляСписка";
		Команда.РежимЗаписи = "Проводить";
		Команда.ФункциональныеОпции = "ИспользоватьУчетОригиналовПервичныхДокументов";
		Команда.Обработчик = "УчетОригиналовПервичныхДокументовКлиент.Подключаемый_УстановитьСостояниеОригинала";	

КонецПроцедуры

Процедура ПередПеремещениемЭлемента(ПеремещаемыйЭлемент, СоседнийЭлемент, Направление, ТекстОшибки, СтандартнаяОбработка) Экспорт
	
	Если ТипЗнч(ПеремещаемыйЭлемент) <> Тип("СправочникСсылка.СостоянияОригиналовПервичныхДокументов") Тогда
		Возврат;
	КонецЕсли;
	
	ЭлементФормаНапечатана = ПредопределенноеЗначение("Справочник.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана");
	ЭлементОригиналПолучен = ПредопределенноеЗначение("Справочник.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен");
	
	ПеремещениеВниз = Направление = НастройкаПорядкаЭлементов.НаправлениеПеремещенияЭлементаВниз();
	ПеремещениеВверх = Направление = НастройкаПорядкаЭлементов.НаправлениеПеремещенияЭлементаВверх();
	
	Если СоседнийЭлемент = ЭлементФормаНапечатана И ПеремещениеВверх
		Или (ПеремещаемыйЭлемент = ЭлементФормаНапечатана И ПеремещениеВниз) Тогда
		СтандартнаяОбработка = Ложь;
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Состояние ""%1"" является начальным, размещение перед ним других состояний не предусмотрено.'"),
			ЭлементФормаНапечатана);
	КонецЕсли;
	
	Если СоседнийЭлемент = ЭлементОригиналПолучен И ПеремещениеВниз 
		Или (ПеремещаемыйЭлемент = ЭлементОригиналПолучен И ПеремещениеВверх) Тогда
		СтандартнаяОбработка = Ложь;
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Состояние ""%1"" является конечным, размещение после него других состояний не предусмотрено.'"),
			ЭлементОригиналПолучен);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ПраваНаИзменениеСостояния()
	
	Возврат ПравоДоступа("Редактирование", Метаданные.РегистрыСведений.СостоянияОригиналовПервичныхДокументов);

КонецФункции

//	Параметры:
//  ДанныеЗаписи - Массив из см. УстановитьНовоеСостояниеОригиналаМассив.ДанныеЗаписи
//               - ДокументСсылка - документ, для которого необходимо изменить состояние оригинала.  
//  ИмяСостояния - Строка - устанавливаемое состояние.
//
// Возвращаемое значение:
//  Строка - "Изменено", если состояние оригинала документа не повторяется и было записано;
//           "НеИзменено" 
//           "НеПроведено" 
//
Функция УстановитьНовоеСостояниеОригинала(Знач ДанныеЗаписи, Знач ИмяСостояния) Экспорт

	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьУчетОригиналовПервичныхДокументов") Тогда
		Возврат "НеИзменено";
	КонецЕсли;
		
	ВыполнитьПроверкуПравДоступа("Редактирование", Метаданные.РегистрыСведений.СостоянияОригиналовПервичныхДокументов);

	ОбъектыЗаписи = Новый Массив;
	ДокументыДляПроверки = Новый Массив;
	Если ТипЗнч(ДанныеЗаписи) = Тип("Массив") Тогда
		Для Каждого Строка Из ДанныеЗаписи Цикл
			Ссылка = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Строка, "Ссылка"); 
			Если ЭтоОбъектУчета(Ссылка) Тогда
				ДокументыДляПроверки.Добавить(Ссылка);
				ОбъектыЗаписи.Добавить(Строка);
			КонецЕсли;
		КонецЦикла;
	Иначе
		ДокументыДляПроверки.Добавить(ДанныеЗаписи);
		ОбъектыЗаписи.Добавить(ДанныеЗаписи);
	КонецЕсли;

	НепроведенныеДокументы = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов(ДокументыДляПроверки);
	Если НепроведенныеДокументы.Количество() > 0 Тогда
		Возврат "НеПроведено";
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	Если ТипЗнч(ДанныеЗаписи) = Тип("Массив") Тогда
		 Результат = УстановитьНовоеСостояниеОригиналаМассив(ДанныеЗаписи, ИмяСостояния);
	Иначе
		 Результат = УстановитьНовоеСостояниеОригиналаДокумента(ДанныеЗаписи, ИмяСостояния);
	КонецЕсли;
	Возврат ?(Результат, "Изменено", "НеИзменено");
	
КонецФункции

//	Параметры:
//  ДанныеЗаписи - Массив из Структура - данные об изменяемом состоянии оригинала:
//                 * ОбщееСостояние 						- Булево - Истина, если текущее состояние является общим;
//                 * Ссылка 								- ДокументСсылка - документ, для которого необходимо изменить состояние оригинала;
//                 * СостояниеОригиналаПервичногоДокумента - СправочникСсылка.СостоянияОригиналовПервичныхДокументов -
//                                                           текущие состояние оригинала первичного документа;
//                 * ПервичныйДокумент 					- Строка - идентификатор первичного документа. Задается, если данное состояние не является общим;
//                 * Извне 								- Булево - Истина, если первичный документ был добавлен пользователем вручную. Задается, если данное состояние не является общим. 
//  ИмяСостояния - Строка - устанавливаемое состояние.
//
// Возвращаемое значение:  
//  Булево - Истина, если состояние оригинала документа не повторяется и было записано.
//
Функция УстановитьНовоеСостояниеОригиналаМассив(Знач ДанныеЗаписи, Знач ИмяСостояния)

	Изменено = Ложь;
	Для Каждого Запись Из ДанныеЗаписи Цикл

		Если СокрЛП(Запись.СостояниеОригиналаПервичногоДокумента) <> СокрЛП(ИмяСостояния) Тогда
			Если Запись.ОбщееСостояние Тогда
				ПроверкаЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьНаборЗаписей();
				ПроверкаЗаписьСостоянияОригинала.Отбор.Владелец.Установить(Запись.Ссылка);
				ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Ложь);
				ПроверкаЗаписьСостоянияОригинала.Прочитать();

				Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда
					Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл
						Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда								
							Изменено = Истина;
							ТабличнаяЧасть = ТабличнаяЧастьССотрудниками(Запись.Ссылка); 
							Если ТабличнаяЧасть <> "" Тогда
								РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка,
									ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне,ПрошлаяЗапись.Сотрудник);
							Иначе
								РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка,
									ПрошлаяЗапись.ПервичныйДокумент,ПрошлаяЗапись.ПервичныйДокументПредставление,ИмяСостояния,ПрошлаяЗапись.ФормаИзвне);
							КонецЕсли; 
						КонецЕсли; 
					КонецЦикла;
				КонецЕсли;
				Изменено = Истина;
				РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния);
			Иначе
				ПроверкаЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьНаборЗаписей();
				ПроверкаЗаписьСостоянияОригинала.Отбор.Владелец.Установить(Запись.Ссылка);
				ПроверкаЗаписьСостоянияОригинала.Прочитать();
				Если ПроверкаЗаписьСостоянияОригинала.Количество()> 0 Тогда
					ПроверкаЗаписьСостоянияОригинала.Отбор.ПервичныйДокумент.Установить(Запись.ПервичныйДокумент);
					ПроверкаЗаписьСостоянияОригинала.Прочитать();
					ТабличнаяЧасть = ТабличнаяЧастьССотрудниками(Запись.Ссылка); 
					Если ТабличнаяЧасть <> "" Тогда
						Для Каждого Сотрудник Из Запись.Ссылка[ТабличнаяЧасть] Цикл
							Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл
								Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда
									Изменено = Истина;
									РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка,
										Запись.ПервичныйДокумент,Запись.ПервичныйДокументПредставление,ИмяСостояния,Запись.Извне,Сотрудник.Сотрудник);
										РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния);
								КонецЕсли; 
							КонецЦикла;
						КонецЦикла;
					Иначе
						Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл
							Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда
								Изменено = Истина;
								РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Запись.Ссылка,
									Запись.ПервичныйДокумент,Запись.ПервичныйДокументПредставление,ИмяСостояния,Запись.Извне);
								РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния);
							КонецЕсли; 
						КонецЦикла;
					КонецЕсли;
					
				Иначе
					Изменено = Истина;
					РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Запись.Ссылка,ИмяСостояния);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;

	КонецЦикла;
	Возврат Изменено;

КонецФункции

//	Параметры:
//  Документ - ДокументСсылка - документ, для которого необходимо изменить состояние оригинала.
//  ИмяСостояния - Строка - устанавливаемое состояние.
//
// Возвращаемое значение:
//  Булево - Истина, если состояние оригинала документа не повторяется и было записано.
//
Функция УстановитьНовоеСостояниеОригиналаДокумента(Знач Документ, Знач ИмяСостояния)

	Изменено = Ложь;
	
	ПроверкаЗаписьСостоянияОригинала = РегистрыСведений.СостоянияОригиналовПервичныхДокументов.СоздатьНаборЗаписей();
	ПроверкаЗаписьСостоянияОригинала.Отбор.Владелец.Установить(Документ);
	ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Истина);
	ПроверкаЗаписьСостоянияОригинала.Прочитать();
	
	Если ПроверкаЗаписьСостоянияОригинала.Количество()> 0 Тогда 
		Если СокрЛП(ПроверкаЗаписьСостоянияОригинала[0].Состояние) <> ИмяСостояния Тогда
			ПроверкаЗаписьСостоянияОригинала.Отбор.ОбщееСостояние.Установить(Ложь);
			ПроверкаЗаписьСостоянияОригинала.Прочитать();
			Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда

				ТабличнаяЧасть = ТабличнаяЧастьССотрудниками(Документ); 
				Если ТабличнаяЧасть <> "" Тогда
					Для Каждого Сотрудник Из Документ[ТабличнаяЧасть] Цикл
						ПроверкаЗаписьСостоянияОригинала.Отбор.Сотрудник.Установить(Сотрудник.Сотрудник);
						ПроверкаЗаписьСостоянияОригинала.Прочитать(); 
						Если ПроверкаЗаписьСостоянияОригинала.Количество()>0 Тогда
							Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл
									Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда
										Изменено = Истина;
										РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ,
											ПрошлаяЗапись.ПервичныйДокумент, ПрошлаяЗапись.ПервичныйДокументПредставление, 
											ИмяСостояния, ПрошлаяЗапись.ФормаИзвне, Сотрудник.Сотрудник);
									КонецЕсли;
								КонецЦикла; 
						КонецЕсли; 	
					КонецЦикла;
				Иначе
					Для Каждого ПрошлаяЗапись Из ПроверкаЗаписьСостоянияОригинала Цикл
						Если СокрЛП(ПрошлаяЗапись.Состояние) <> ИмяСостояния Тогда
							Изменено = Истина;
							РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьСостояниеОригиналаДокументаПоПечатнымФормам(Документ,
								ПрошлаяЗапись.ПервичныйДокумент, ПрошлаяЗапись.ПервичныйДокументПредставление, 
								ИмяСостояния, ПрошлаяЗапись.ФормаИзвне);
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
			КонецЕсли;
			Изменено = Истина;
			РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Документ, ИмяСостояния);
		КонецЕсли;
	Иначе 
		Изменено = Истина;
		РегистрыСведений.СостоянияОригиналовПервичныхДокументов.ЗаписатьОбщееСостояниеОригиналаДокумента(Документ, ИмяСостояния);
	КонецЕсли;

	Возврат Изменено;

КонецФункции

// Заполняет выпадающий список выбора состояний на форме.
//
//	Параметры:
//  Форма - ФормаКлиентскогоПриложения - форма списка документа.
//
Процедура ЗаполнитьСписокВыбораСостоянийОригинала(Форма, СостоянияОригиналов)

	СписокВыбораСостоянийОригинала = Форма.СписокВыбораСостоянийОригинала;
	СписокВыбораСостоянийОригинала.Очистить(); 
	
	Для каждого Состояние Из СостоянияОригиналов Цикл

		Если Состояние.Ссылка = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен Тогда 
			СписокВыбораСостоянийОригинала.Добавить(Состояние.Наименование,Состояние.Наименование,,БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналПолучен);
		ИначеЕсли Состояние.Ссылка = Справочники.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана Тогда
			СписокВыбораСостоянийОригинала.Добавить(Состояние.Наименование,Состояние.Наименование,,БиблиотекаКартинок.СостояниеОригиналаПервичногоДокументаОригиналНеПолучен);
		Иначе
			СписокВыбораСостоянийОригинала.Добавить(Состояние.Наименование,Состояние.Наименование);
		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

// Возвращает массив состояний, доступных пользователю.
//
//	Возвращаемое значение:
//  ТаблицаЗначений - состояния оригинала, разрешенные пользователям, и используемые при смене состояния оригинала:
//    * Наименование 	- Строка - наименование состояния оригинала;
//    * Ссылка		- СправочникСсылка.СостоянияОригиналовПервичныхДокументов - ссылка на элемент справочника СостоянияОригиналовПервичныхДокументов.
//
Функция ИспользуемыеСостояния()Экспорт 

	УстановитьПривилегированныйРежим(Истина);

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	СостоянияОригиналовПервичныхДокументов.Наименование КАК Наименование,
	               |	СостоянияОригиналовПервичныхДокументов.Ссылка КАК Ссылка
	               |ИЗ
	               |	Справочник.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов
	               |ГДЕ
	               |	НЕ СостоянияОригиналовПервичныхДокументов.Ссылка = ЗНАЧЕНИЕ(Справочник.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе)
	               |	И НЕ СостоянияОригиналовПервичныхДокументов.ПометкаУдаления
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	СостоянияОригиналовПервичныхДокументов.РеквизитДопУпорядочивания";

	Выборка = Запрос.Выполнить();
	
	УстановитьПривилегированныйРежим(Ложь);

	Возврат Выборка.Выгрузить();

КонецФункции

// Возвращает ключ записи регистра общего состояния оригинала документа по ссылке.
//
//	Параметры:
//  ДокументСсылка - ДокументСсылка - ссылка на документ,для которого необходимо получить ключ записи общего состояния.
//
//	Возвращаемое значение:
//  РегистрСведенийКлючЗаписи.СостоянияОригиналовПервичныхДокументов - ключ записи регистра общего состояния оригинала документа.
//
Функция КлючЗаписиОбщегоСостояния(ДокументСсылка) Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст ="ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СостоянияОригиналовПервичныхДокументов.Владелец КАК Владелец,
	|	СостоянияОригиналовПервичныхДокументов.ПервичныйДокумент КАК ПервичныйДокумент,
	|	СостоянияОригиналовПервичныхДокументов.ОбщееСостояние КАК ОбщееСостояние,
	|	СостоянияОригиналовПервичныхДокументов.ФормаИзвне КАК ФормаИзвне,
	|	СостоянияОригиналовПервичныхДокументов.Сотрудник КАК Сотрудник
	|ИЗ
	|	РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов
	|ГДЕ
	|	СостоянияОригиналовПервичныхДокументов.Владелец = &Ссылка
	|	И СостоянияОригиналовПервичныхДокументов.ОбщееСостояние" ;
	
	Запрос.УстановитьПараметр("Ссылка",ДокументСсылка);

	Выборка = Запрос.Выполнить().Выгрузить();

	Для Каждого Ключ Из Выборка Цикл
		ПередаваемыеПараметры = Новый Структура("Владелец, ПервичныйДокумент, ОбщееСостояние, ФормаИзвне, Сотрудник");
		ЗаполнитьЗначенияСвойств(ПередаваемыеПараметры,Ключ);

		ПараметрыМассив = Новый Массив;
		ПараметрыМассив.Добавить(ПередаваемыеПараметры);

		КлючЗаписиРегистра = Новый("РегистрСведенийКлючЗаписи.СостоянияОригиналовПервичныхДокументов", ПараметрыМассив);
	КонецЦикла;

	Возврат КлючЗаписиРегистра;

КонецФункции

// Проверяет и возвращает признак того, является ли документ по ссылке документом с учетом оригиналов.
//
//	Параметры:
//  ДокументСсылка - ДокументСсылка - ссылка на документ, который необходимо проверить.
//
//	Возвращаемое значение:
//  Булево - Истина, если документ является объектом учетом оригиналов.
//
Функция ЭтоОбъектУчета(ДокументСсылка) Экспорт

	Если ДокументСсылка = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Метаданные.ОпределяемыеТипы.ОбъектСУчетомОригиналовПервичныхДокументов.Тип.СодержитТип(ТипЗнч(ДокументСсылка));

КонецФункции

// Проверяет, хранятся ли в документе сведения о сотрудниках и возвращает наименование соответствующей табличной части.
//
//	Параметры:
//  ДокументСсылка - ДокументСсылка - ссылка на документ, который необходимо проверить.
//
//	Возвращаемое значение:
//  Строка - наименование табличной части документа, в которой хранятся сотрудники. Пустая, если это не
//           документ с несколькими сотрудниками.
//
Функция ТабличнаяЧастьССотрудниками(ДокументСсылка) Экспорт
	
	СписокОбъектов = Новый Соответствие();
	Результат = "";
	УчетОригиналовПервичныхДокументовПереопределяемый.ПриОпределенииМногосотрудниковыхДокументов(СписокОбъектов);
	ТипДокумента = ОбщегоНазначения.ИмяТаблицыПоСсылке(ДокументСсылка);
	Если СписокОбъектов[ТипДокумента] <> Неопределено Тогда
		Результат = СписокОбъектов[ТипДокумента];
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Возвращает массив с описанием типов подключенных к подсистеме объектов.
//
//	Возвращаемое значение:
//  Массив из Тип - массив с описанием типов подключенных к подсистеме объектов.
//
Функция СведенияОПодключенныхОбъектах() Экспорт

	ДоступныеТипы = Метаданные.ОпределяемыеТипы.ОбъектСУчетомОригиналовПервичныхДокументов.Тип.Типы();
	Возврат ДоступныеТипы;

КонецФункции

// Возвращает ссылку на документ по штрихкоду табличного документа.
//
// Параметры:
//  Штрихкод - Строка
//  Менеджеры - Массив из СправочникСсылка
//            - ДокументСсылка
//            - ЗадачаСсылка
//
// Возвращаемое значение:
//  Массив из ДокументСсылка
//
Функция СсылкаПоШтрихкодуТабличногоДокумента(Штрихкод, Менеджеры = Неопределено) 

	Если Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Штрихкод, Ложь, Ложь)
		ИЛИ СокрЛП(Штрихкод) = "" Тогда
		Возврат Новый Массив;
	КонецЕсли;

	ШтрихкодВШестнадцатеричномВиде = ПреобразоватьДесятичноеЧислоВШестнадцатеричнуюСистемуСчисления(Число(Штрихкод));
	Пока СтрДлина(ШтрихкодВШестнадцатеричномВиде) < 32 Цикл
		ШтрихкодВШестнадцатеричномВиде = "0" + ШтрихкодВШестнадцатеричномВиде;
	КонецЦикла;

	Идентификатор = Сред(ШтрихкодВШестнадцатеричномВиде, 1,  8)
		+ "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 9,  4)
		+ "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 13, 4)
		+ "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 17, 4)
		+ "-" + Сред(ШтрихкодВШестнадцатеричномВиде, 21, 12);

	Если СтрДлина(Идентификатор) <> 36 Тогда
		Возврат Новый Массив;
	КонецЕсли;

	Если Менеджеры = Неопределено Тогда
		МенеджерыОбъектов = Новый Массив();
		Для Каждого ЭлементМетаданных Из Метаданные.Документы Цикл
			МенеджерыОбъектов.Добавить(Документы[ЭлементМетаданных.Имя]);
		КонецЦикла;
	Иначе
		МенеджерыОбъектов = Новый Массив();
		Для Каждого ПустаяСсылка Из Менеджеры Цикл
			ТипСсылки = ТипЗнч(ПустаяСсылка);
			
			Если Документы.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
				МенеджерыОбъектов.Добавить(Документы[ПустаяСсылка.Метаданные().Имя]);
				
			ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипСсылки) Тогда
				МенеджерыОбъектов.Добавить(Справочники[ПустаяСсылка.Метаданные().Имя]);
				
			ИначеЕсли Задачи.ТипВсеСсылки(ТипСсылки).СодержитТип(ТипСсылки) Тогда	
				МенеджерыОбъектов.Добавить(Задачи[ПустаяСсылка.Метаданные().Имя]);
				
			ИначеЕсли БизнесПроцессы.ТипВсеСсылки(ТипСсылки).СодержитТип(ТипСсылки) Тогда	
				МенеджерыОбъектов.Добавить(БизнесПроцессы[ПустаяСсылка.Метаданные().Имя]);
				
			ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки(ТипСсылки).СодержитТип(ТипСсылки) Тогда
				МенеджерыОбъектов.Добавить(ПланыВидовХарактеристик[ПустаяСсылка.Метаданные().Имя]);
				
			Иначе
				ТекстИсключения = НСтр("ru = 'Ошибка распознавания штрихкода: тип ""%Тип%"" не поддерживается.'");
				ТекстИсключения = СтрЗаменить(ТекстИсключения, "%Тип%", ТипСсылки);				
				ВызватьИсключение ТекстИсключения;
			КонецЕсли;

		КонецЦикла;
	КонецЕсли;

	Запрос = Новый Запрос;

	МассивСсылок = Новый Массив;
	ПервыйЗапрос = Истина;
	Для Каждого Менеджер Из МенеджерыОбъектов Цикл

		Попытка
			Ссылка = Менеджер.ПолучитьСсылку(Новый УникальныйИдентификатор(Идентификатор));
		Исключение
			Продолжить;
		КонецПопытки;
		
		МетаданныеСсылки = Ссылка.Метаданные();
		Если Не ПравоДоступа("Чтение", МетаданныеСсылки) Тогда
			Продолжить;
		КонецЕсли;
		
		МассивСсылок.Добавить(Ссылка);
		
		Если ПервыйЗапрос Тогда
			Запрос.Текст = Запрос.Текст +
			"ВЫБРАТЬ РАЗРЕШЕННЫЕ Таблица.Ссылка КАК Ссылка
			|ИЗ &МетаданныеСсылкиПолноеИмя КАК Таблица
			|ГДЕ Ссылка В (&МассивСсылок)
			|";
		Иначе	
			Запрос.Текст = Запрос.Текст + 
			"ОБЪЕДИНИТЬ ВСЕ
			|
			|ВЫБРАТЬ Таблица.Ссылка КАК Ссылка
			|ИЗ &МетаданныеСсылкиПолноеИмя КАК Таблица
			|ГДЕ Ссылка В (&МассивСсылок)
			|";
		КонецЕсли;
		
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&МетаданныеСсылкиПолноеИмя", МетаданныеСсылки.ПолноеИмя());
		ПервыйЗапрос = Ложь;

	КонецЦикла;

	Если Не ПервыйЗапрос Тогда
		Запрос.Параметры.Вставить("МассивСсылок", МассивСсылок);
		Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	Иначе
		Возврат Новый Массив;
	КонецЕсли;

КонецФункции

// Процедура обрабатывает действия по учету оригиналов после сканирования штрихкода документа.
//
//	Параметры:
//  Штрихкод - Строка - отсканированный штрихкод документа.
//
Процедура ОбработатьШтрихкод(Штрихкод) Экспорт

	СсылкаПоШтрихкоду = СсылкаПоШтрихкодуТабличногоДокумента(Штрихкод);
	УстановитьНовоеСостояниеОригинала(СсылкаПоШтрихкоду[0], Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен);

КонецПроцедуры

// Проверяет после записи состояний печатных форм документа в регистр, имеют ли они одинаковые состояния.
//
//	Параметры:
//  ДокументСсылка - ДокументСсылка - ссылка на документ,у которого необходимо проверить состояния печатных форм.
//  ИмяСостояния - Строка - имя состояния, которое было установлено.
//
//	Возвращаемое значение:
//  Булево - Истина, если все печатные формы документа имеют одинаковое состояние.
//
Функция СостояниеПечатныхФормОдинаково(ДокументСсылка,ИмяСостояния) Экспорт

	СостояниеФормОдинаково = Ложь;

	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	СостоянияОригиналовПервичныхДокументов.Состояние.Наименование КАК СостояниеОригинала
	               |ИЗ
	               |	РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов
	               |ГДЕ
	               |	СостоянияОригиналовПервичныхДокументов.Владелец = &Ссылка
	               |	И НЕ СостоянияОригиналовПервичныхДокументов.ОбщееСостояние";
	Запрос.УстановитьПараметр("Ссылка",ДокументСсылка);

	Выборка = Запрос.Выполнить().Выбрать();

	Пока Выборка.Следующий() Цикл

		Если Выборка.СостояниеОригинала = СокрЛП(ИмяСостояния) Тогда
			СостояниеФормОдинаково = Истина
		Иначе
			СостояниеФормОдинаково = Ложь;
			Прервать;
		КонецЕсли;

	КонецЦикла;

	Возврат СостояниеФормОдинаково;

КонецФункции

// Возвращает структуру с данными о текущим общем состоянии оригинала документа по ссылке.
//
//	Параметры:
//  ДокументСсылка - ДокументСсылка - ссылка на документ, для которого необходимо получить сведения о общем состоянии. 
//
//  Возвращаемое значение:
//    Структура - основные сведения о общем состоянии оригинала:
//    * Ссылка - ДокументСсылка - ссылка на документ;
//    * СостояниеОригиналаПервичногоДокумента - СправочникСсылка.СостоянияОригиналовПервичныхДокументов - текущее
//        состояние оригинала документа;
//
Функция СведенияОСостоянииОригиналаПоСсылке(ДокументСсылка) Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст ="ВЫБРАТЬ РАЗРЕШЕННЫЕ
	              |	СостоянияОригиналовПервичныхДокументов.Состояние КАК Состояние,
	              |	СостоянияОригиналовПервичныхДокументов.ОбщееСостояние КАК ОбщееСостояние
	              |ИЗ
	              |	РегистрСведений.СостоянияОригиналовПервичныхДокументов КАК СостоянияОригиналовПервичныхДокументов
	              |ГДЕ
	              |	СостоянияОригиналовПервичныхДокументов.Владелец = &Ссылка
	              |	И СостоянияОригиналовПервичныхДокументов.ОбщееСостояние = ИСТИНА";
	
	Запрос.УстановитьПараметр("Ссылка",ДокументСсылка);
	
	СведенияОСостоянии = Новый Структура;

	Если Не Запрос.Выполнить().Пустой() Тогда
		Выборка = Запрос.Выполнить().Выбрать();
		Выборка.Следующий();
		
		СведенияОСостоянии.Вставить("Ссылка",ДокументСсылка);
		СведенияОСостоянии.Вставить("СостояниеОригиналаПервичногоДокумента",Выборка.Состояние);	
	КонецЕсли;

	Возврат СведенияОСостоянии;

КонецФункции

// Процедура обработчика обновления для заполнения начальных элементов справочника "Состояния оригиналов первичных документов".
Процедура ЗаполнитьСостоянияОригиналаПервичногоДокумента() Экспорт

	СостояниеОригинала = Справочники.СостоянияОригиналовПервичныхДокументов.ФормаНапечатана.ПолучитьОбъект();
	ЗаблокироватьДанныеДляРедактирования(СостояниеОригинала.Ссылка);
	СостояниеОригинала.Наименование = НСтр("ru='Форма напечатана'", ОбщегоНазначения.КодОсновногоЯзыка());
	СостояниеОригинала.Описание = НСтр("ru='Состояние, означающее, что  печатная форма только печаталась.'", ОбщегоНазначения.КодОсновногоЯзыка());
	СостояниеОригинала.РеквизитДопУпорядочивания = 1;
	ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СостояниеОригинала);

	СостояниеОригинала = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналыНеВсе.ПолучитьОбъект();
	ЗаблокироватьДанныеДляРедактирования(СостояниеОригинала.Ссылка);
	СостояниеОригинала.Наименование = НСтр("ru='Оригиналы не все'", ОбщегоНазначения.КодОсновногоЯзыка());
	СостояниеОригинала.Описание = НСтр("ru='Общее состояние для документа, у которого оригиналы печатных форм находятся в разных состояниях.'", ОбщегоНазначения.КодОсновногоЯзыка());
	СостояниеОригинала.РеквизитДопУпорядочивания = 99998;
	ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СостояниеОригинала);

	СостояниеОригинала = Справочники.СостоянияОригиналовПервичныхДокументов.ОригиналПолучен.ПолучитьОбъект();
	ЗаблокироватьДанныеДляРедактирования(СостояниеОригинала.Ссылка);
	СостояниеОригинала.Наименование = НСтр("ru='Оригинал получен'", ОбщегоНазначения.КодОсновногоЯзыка());
	СостояниеОригинала.Описание = НСтр("ru='Состояние, означающее, что подписанный оригинал печатной формы есть в наличии.'", ОбщегоНазначения.КодОсновногоЯзыка());
	СостояниеОригинала.РеквизитДопУпорядочивания = 99999;
	ОбновлениеИнформационнойБазы.ЗаписатьОбъект(СостояниеОригинала);


КонецПроцедуры

Функция ПреобразоватьДесятичноеЧислоВШестнадцатеричнуюСистемуСчисления(Знач ДесятичноеЧисло)

	Результат = "";

	Пока ДесятичноеЧисло > 0 Цикл
		ОстатокОтДеления = ДесятичноеЧисло % 16;
		ДесятичноеЧисло = (ДесятичноеЧисло - ОстатокОтДеления) / 16;
		Результат = Сред("0123456789abcdef", ОстатокОтДеления + 1, 1) + Результат;
	КонецЦикла;

	Возврат Результат;
	
КонецФункции

// Переопределяет списки значений объектов печати и их макетов
//
//	Параметры:
//  ОбъектыПечати - СписокЗначений - список ссылок на объекты печати.
//  СписокПечати - СписокЗначений - список с именами макетов и представлениями печатных форм.
//
Процедура ПриОпределенииСпискаПечатныхФорм(ОбъектыПечати, СписокПечати) Экспорт
	
	ТаблицаУчетаОригиналов = ТаблицаУчетаОригиналов();
	Если ТаблицаУчетаОригиналов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ИменаМакетов = Новый Массив;
	Для Каждого Макет Из СписокПечати Цикл
		ИменаМакетов.Добавить(Макет.Значение);
	КонецЦикла;
	
	МетаданныеСоответствие = Новый Соответствие();
	Для Каждого ОбъектПечати Из ОбъектыПечати Цикл
		МетаданныеСоответствие.Вставить(ОбъектПечати.Значение.Метаданные());
	КонецЦикла;
	ОбъектыМетаданных = ОбщегоНазначения.ВыгрузитьКолонку(МетаданныеСоответствие, "Ключ");
	
	МакетыУдалить = Новый Массив;
	Для Каждого ОбъектМетаданных Из ОбъектыМетаданных Цикл
		НайденныеСтроки = ТаблицаУчетаОригиналов.НайтиСтроки(Новый Структура("ОбъектМетаданных", ОбъектМетаданных));
		Если НайденныеСтроки.Количество() = 0 Тогда
			Продолжить;
		КонецЕсли;
		МакетыОставить = ОбщегоНазначения.ВыгрузитьКолонку(НайденныеСтроки, "Идентификатор");
		Для Каждого Макет Из ИменаМакетов Цикл
			Если МакетыОставить.Найти(Макет) = Неопределено Тогда
				МакетыУдалить.Добавить(Макет);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Для Каждого Макет Из МакетыУдалить Цикл
		НайденныйМакет = СписокПечати.НайтиПоЗначению(Макет);
		Если НайденныйМакет <> Неопределено Тогда
			СписокПечати.Удалить(НайденныйМакет);
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

Функция ТаблицаУчетаОригиналов()
	
	Таблица = Новый ТаблицаЗначений;
	Таблица.Колонки.Добавить("ОбъектМетаданных", Новый ОписаниеТипов("ОбъектМетаданных"));
	Таблица.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
	
	УчетОригиналовПервичныхДокументовПереопределяемый.ЗаполнитьТаблицуУчетаОригиналов(Таблица);
	
	Возврат Таблица;
	
КонецФункции

#КонецОбласти
